import {EmptyUtil, MsgUtil} from '@/utils'

export type CellAlign = 'left' | 'center' | 'right'
export type CellFixed = 'left' | 'right' | undefined


export class ColumnsUtil {


    /**
     * 设置图标单元格
     * @param show  是否显示
     * @param width 单元格宽度 单元格宽度为0时 自动适配宽度
     * @param align 单元格对齐方式
     * @param fixed
     * */
    static actionColumn(width = 120, show = true, align: CellAlign = 'right', fixed: CellFixed = 'right') {
        const res = {
            title: '操作', show, dataIndex: 'action', slotName: 'action', align, width: undefined, fixed}
        if (width > 0) res.width = width
        return res
    }

    /**
     * 设置数据字典关系列  数据结构必须为 { label ,value ,theme }
     * @param title 单元格标题
     * @param dataIndex 关联字段名称
     * @param show  是否显示
     * @param width 单元格宽度 单元格宽度为0时 自动适配宽度
     * @param align 单元格对齐方式
     * @param ellipsis 超出单元格宽度是显示否省略号
     * */
    static tagColumn(title: string, dataIndex: string, width = 100, show = true, align: CellAlign = 'center', ellipsis = true) {
        const render = (data) => {
            try {
                const res = data.record[dataIndex]
                if (!res) return null
                if (typeof res !== 'object') return res

                const {label, theme} = res
                if (EmptyUtil.isEmptyString(theme) || theme === 'text') return label
                return <a-tag color={theme}>{label} </a-tag>
            } catch (err) {
                MsgUtil.message(`字段类型错误:${dataIndex}`)
                return '字段类型错误'
            }
        }
        const res = {title, dataIndex, show, width: undefined, ellipsis, align, render}
        if (width > 0) res.width = width
        return res
    }

    /**
     * 设置普通数据渲染列 正常渲文本、数字字段
     * @param title 单元格标题
     * @param dataIndex 关联字段名称
     * @param show  是否显示
     * @param width 单元格宽度 单元格宽度为0时 自动适配宽度
     * @param align 单元格对齐方式
     * @param fixed
     * @param ellipsis 超出单元格宽度是显示否省略号
     * */
    static normalColumn(
        title: string,
        dataIndex: string,
        width = 100,
        align: CellAlign = 'left',
        show = true,
        ellipsis = true,
        fixed: CellFixed = undefined
    ) {
        return {
            title, dataIndex, slotName: dataIndex,
            show, align, fixed, ellipsis, width, tooltip: true
        }
    }

    /**
     * 设置普通数据渲染列 正常渲文本、数字字段
     * @param title 单元格标题
     * @param dataIndex 关联字段名称
     * @param trueText  值为TRUE时 显示的文本
     * @param falseText 值为FALSE时 显示的文本
     * @param show  是否显示
     * @param width 单元格宽度 单元格宽度为0时 自动适配宽度
     * @param align 单元格对齐方式
     * @param ellipsis 超出单元格宽度是显示否省略号
     * */
    static booleanColumn(
        title: string,
        dataIndex: string,
        trueText: string,
        falseText: string,
        width = 100,
        show = true,
        align: CellAlign = 'left',
        ellipsis = true
    ) {
        const render = (data) => {
            const text = data.record[dataIndex]
            if (text === null || text === '' || text === undefined) return null
            if (typeof text === 'boolean') {
                return text === true ? trueText : falseText
            }
            MsgUtil.message(`字段类型错误:${dataIndex}`)
        }
        const res = {
            title,
            dataIndex,
            slotName: dataIndex,
            show,
            align,
            ellipsis,
            width: undefined,
            render,
            tooltip: true
        }
        if (width > 0) res.width = width
        return res
    }

    /**
     * 设置图标单元格
     * @param title 单元格标题
     * @param dataIndex 关联字段名称
     * @param iconSize 图标名称
     * @param show  是否显示
     * @param width 单元格宽度 单元格宽度为0时 自动适配宽度
     * @param align 单元格对齐方式
     * */
    static iconColumn(title: string, dataIndex: string, width = 100, iconSize = 24, show = true, align: CellAlign = 'center') {
        try {


            const render = (data) => {


                if (EmptyUtil.isEmptyString(data.record[dataIndex])) return null;


                const text = data.record?.[dataIndex].trim()
                return <smart-icon name={text} size={iconSize}/>
            }

            const res = {title, dataIndex, slotName: dataIndex, show, width: undefined, align, render}
            if (width > 0) res.width = width
            return res
        } catch (e) {
            return null
        }
    }


    /**
     * 设置图标单元格
     * @param title 单元格标题
     * @param dataIndex 关联字段名称
     * @param show  是否显示
     * @param width 单元格宽度 单元格宽度为0时 自动适配宽度
     * @param imgWidth 图片宽度
     * @param imgHeight 图片高度
     * @param preview 图片是否 允许 预览
     * @param align 单元格对齐方式
     * */
    static imageColumn(
        title: string,
        dataIndex: string,
        show = true,
        width = 100,
        imgWidth = 80,
        imgHeight = 60,
        preview = true,
        align: CellAlign = 'center'
    ) {
        const render = (data) => {
            const text = data.record[dataIndex]
            return <a-image width={imgWidth} height={imgHeight} src={text} preview={preview} fit="cover">
                <solt name='extra'>
                    加载失败
                </solt>
            </a-image>
        }
        const res = {title, dataIndex, slotName: dataIndex, show, width: undefined, align, render}
        if (width > 0) res.width = width
        return res
    }


    /**
     * 设置普通数据渲染列 正常渲文本、数字字段
     * @param title 单元格标题
     * @param dataIndex 关联字段名称
     * @param show  是否显示
     * @param width 单元格宽度 单元格宽度为0时 自动适配宽度
     * @param align 单元格对齐方式

     * @param status
     * */
    static colorColumn(
        title: string,
        dataIndex: string,
        status: 'normal' | 'success' | 'warning' | 'danger' = 'success',
        width = 100,
        align: CellAlign = 'left',
        show = true,
    ) {

        const render = (data) => {


            if (EmptyUtil.isEmptyString(data.record[dataIndex])) return null;


            const text = data.record?.[dataIndex].trim()
            return <a-link status={status}>{text}</a-link>
        }

        const res = {
            title, dataIndex, slotName: dataIndex,
            show, align, width: undefined, tooltip: true,
            render
        }
        if (width > 0) res.width = width
        return res
    }


    /**
     * 判断指定列是不是空的
     * @param title 单元格标题
     * @param dataIndex 关联字段名称
     * @param emptyText
     * @param notEmptyText
     * @param show  是否显示
     * @param width 单元格宽度 单元格宽度为0时 自动适配宽度
     * @param align 单元格对齐方式
     * @param ellipsis 超出单元格宽度是显示否省略号
     * */
    static emptyColumn(title: string, dataIndex: string, emptyText: string, notEmptyText: string, width = 100, show = true, align: CellAlign = 'left', ellipsis = true) {



        const render = (data) => {
            const text = data.record[dataIndex]
            if (text === null || text === '' || text === undefined) return  <a-typography-text type="danger">{emptyText}</a-typography-text>
            if (EmptyUtil.isEmptyString(notEmptyText)) return   text
            return    <a-typography-text type="success">{notEmptyText}</a-typography-text>  ;
        }
        const res = {title, dataIndex, slotName: dataIndex, show, align, ellipsis, width: undefined, render, tooltip: true}
        if (width > 0) res.width = width
        return res
    }



    /**
     * 设置图标单元格
     * @param title 单元格标题
     * @param dataIndex 关联字段名称
     * @param show  是否显示
     * @param width 单元格宽度 单元格宽度为0时 自动适配宽度
     * @param imgWidth 图片宽度

     * @param align 单元格对齐方式
     * */
    static avatarColumn(
        title: string,
        dataIndex: string,
        show = true,
        width = 90,
        imgWidth = 56,
        align: CellAlign = 'center'
    ) {
        const render = (data) => {
            const text = data.record[dataIndex]
            return <a-avatar  size={imgWidth} image-url={text}  >
                <smart-icon name="icon-user" size="24"></smart-icon>
            </a-avatar>
        }
        const res = {title, dataIndex, slotName: dataIndex, show, width: undefined, align, render}
        if (width > 0) res.width = width
        return res
    }



}


